// Map集合
package main

import (
	"fmt"
)

type valStruct struct {
	a, b int
}

func main() {
	// 初始化map
	var numMap = make(map[string]string)
	numMap["one"] = "一"
	numMap["tow"] = "二"
	numMap["three"] = "三"
	numMap["four"] = "四"
	fmt.Println("numMap:", numMap)

	// 遍历
	for k := range numMap {
		fmt.Println("k:", k, "\t v:", numMap[k])
	}

	// 查找
	var data, isFind = numMap["one"]
	fmt.Println("isFind:", isFind, "  data:", data)
	data, isFind = numMap["five"]
	fmt.Println("isFind:", isFind, "  data:", data)

	// 删除
	delete(numMap, "one")
	delete(numMap, "five")
	fmt.Println("删除后 ", numMap["one"])

	// map 的 value 是结构体
	_valStruct()

}

func _valStruct() {
	var m = map[string]valStruct{
		"a": {a: 1, b: 2},
	}
	fmt.Println(m)
	//m["a"].a = 100	// 编译出错，go 中的 map 的 value 本身是不可寻址的
	fmt.Println(m["a"].a)

	// 改变map中value是struct中的值
	// 方式一，用临时变量
	val := m["a"]
	val.a = 100
	m["a"] = val // 这一行需要加上
	fmt.Println(m["a"].a)

	// 方式二，用指针
	var mp = map[string]*valStruct{
		"a": {a: 1, b: 2},
	}
	mp["a"].a = 100
	fmt.Println(mp["a"])
}
